home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_04 / welstead / uilstobj.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-13  |  3.4 KB  |  131 lines

  1. Welstead: Listing 5
  2.  
  3. // File UILSTOBJ.CPP  Define the tlist_box class
  4.  
  5. #ifndef UILSTOBJ_CPP
  6. #define UILSTOBJ_CPP
  7.  
  8. #define Uses_TCollection
  9. #define Uses_TNSCollection
  10. #define Uses_TListBox
  11. #define Uses_TEvent
  12. #define Uses_opstream
  13. #define Uses_ipstream
  14. #include "uidatobj.cpp"
  15.  
  16. const cmItemSelect = 300;
  17. const ushort one_col = 1;
  18.  
  19. class TDataCollection:public TCollection {
  20.     public:
  21.     //Create a non-abstract version of TCollection.
  22.     TDataCollection (ccIndex aLimit, ccIndex aDelta):
  23.        TCollection (aLimit,aDelta) {
  24.        };
  25. //We won't use stream I/O, so just override these.
  26.     void *readItem( ipstream& is );
  27.     void writeItem( void *obj, opstream& os );
  28.     };
  29.  
  30. void TDataCollection::writeItem(void *obj,
  31.         opstream& os) {
  32.     os.writeString( (const char *)obj );
  33. }
  34.  
  35. void *TDataCollection::readItem( ipstream& is )
  36. {
  37.     return is.readString();
  38. }
  39.  
  40. typedef struct {
  41.     TDataCollection *item_collection;
  42.     short focused_item;
  43.     short selected_item;
  44.     } tlist_box_data;
  45.  
  46. class tlist_box:public TListBox {
  47.     public:
  48.     // short focused is inherited. Need to distinguish 
  49.     // between 'focused' and 'selected'.
  50.     short selected;     
  51. tlist_box (const TRect& bounds,TScrollBar *aScrollBar):
  52.       TListBox(bounds,one_col,aScrollBar) {
  53.     };
  54.     virtual ushort dataSize()
  55.        {return (sizeof (TDataCollection*) + 
  56.         sizeof (focused) + sizeof (selected));}
  57.     virtual void setData (void *rec);
  58.     virtual void getData (void *rec);
  59.     virtual void handleEvent (TEvent& event);
  60.     };
  61.  
  62. void tlist_box::setData (void *rec)
  63.        {tlist_box_data *the_listbox_rec = 
  64.         (tlist_box_data *)rec;
  65.     selected = the_listbox_rec->selected_item;
  66.     TListBox::setData(the_listbox_rec);
  67.     return;}
  68.  
  69. void tlist_box::getData (void *rec)
  70.      {
  71.      ((tlist_box_data *)rec)->focused_item = focused;
  72.      ((tlist_box_data *)rec)->selected_item = selected;
  73.      return;}
  74.  
  75. void tlist_box::handleEvent (TEvent& event)
  76.     {
  77.     short old_focused = focused;
  78.     if (event.what == evKeyDown) {
  79.        if (event.keyDown.keyCode == kbEnter) {
  80.       selected = focused;
  81.       owner -> endModal (cmItemSelect);
  82.       clearEvent (event);
  83.       return;
  84.       }
  85.        if (event.keyDown.charScan.charCode == ' ') {
  86.       selected = focused;
  87.       owner -> endModal (cmItemSelect);
  88.       clearEvent (event);
  89.       return;
  90.       }
  91.        switch (event.keyDown.keyCode) {
  92.        case kbUp:    case kbDown:     case kbPgUp:
  93.        case kbPgDn:  case kbCtrlPgUp: case kbCtrlPgDn:
  94.        case kbHome:  case kbEnd:
  95.        case kbEsc: TListBox::handleEvent (event); 
  96.           return;
  97.        default: /* Other Keys  */; return;
  98.        } /*  end switch  */
  99.       }  /*  end if  */
  100.     if ((event.what == evMouseDown) && 
  101.         (event.mouse.doubleClick)) {
  102.     selected = focused;
  103.     owner -> endModal (cmItemSelect);
  104.     clearEvent (event);
  105.     return;
  106.     }
  107.     TListBox::handleEvent (event);
  108.     if (focused != old_focused) TListBox::drawView();
  109.     }
  110.  
  111. class tdata_list_box:public tlist_box {
  112.     public:
  113.     tdata_list_box(const TRect& bounds,
  114.     TScrollBar *aScrollBar): 
  115.     tlist_box(bounds,aScrollBar) { };
  116.     virtual void getText (char *dest, short item, 
  117.     short maxlen);
  118.     };
  119.  
  120. void tdata_list_box::getText (char *dest, short item, 
  121.     short maxlen)
  122.     {
  123.     if (list() != 0)
  124.       ((ttyped_data_obj *) (list()->at(item)))->
  125.     get_display_str(dest,maxlen);
  126.     else
  127.       dest = "No items.";
  128.     return;}
  129.  
  130. #endif
  131.